import {NativeModules, Platform} from 'react-native';

const JAnalyticsModule = NativeModules.JAnalyticsModule;

const noop = () => {
};

export const setJSExceptionHandler = (customHandler = noop, allowedInDevMode = false) => {
    if (typeof allowedInDevMode !== "boolean" || typeof customHandler !== "function") {
        return;
    }
    const allowed = allowedInDevMode ? true : !__DEV__;
    if (allowed) {
        // 设置错误处理函数
        global.ErrorUtils.setGlobalHandler(customHandler);
        // 改写 console.error，保证报错能被 ErrorUtils 捕获并调用错误处理函数处理
        console.error = (message, error) => global.ErrorUtils.reportError(error);
    }
};

// export const getJSExceptionHandler = () => global.ErrorUtils.getGlobalHandler();

// export default {
//     setJSExceptionHandler,
//     getJSExceptionHandler,
// };

export default class JAnalytics {
    /**
     * 初始化插件
     *
     * @param {object} params = {
     *  appKey?: String       //极光控制台上注册的应用 appKey
     * }
     *
     * NOTE:
     * 当前版本 appKey 可以不传，iOS 中 params 中没有找到 appKey 字段
     * 会在 JiGuangConfig.plist 中获取 appKey 这个字段
     */
    static init(params) {
        if (Platform.OS == "android") {
            JAnalyticsModule.init();
        } else {
            JAnalyticsModule.setup(params);
        }
    }

    /**
     * 设置是否打印sdk产生的Debug级log信息, 默认为NO(不打印log)
     *
     * @param {object} params = {
     *  enable: Boolean //
     * }
     */
    static setLoggerEnable(enable) {
        if (Platform.OS == "android") {
            JAnalyticsModule.setDebugMode(enable)
        } else {
            JAnalyticsModule.setDebug(enable);
        }
    }

    /**
     * 开启Crash日志收集，默认是关闭状态.
     */
    static crashLogON() {
        if (Platform.OS == "android") {
            JAnalyticsModule.initCrashHandler();
        } else {
            JAnalyticsModule.crashLogON();
        }
    }

    /**
     * 开始记录页面停留
     *
     * @param {object} params = {
     *  pageName: Stirng   // 页面名称，用于标识页面
     * }
     *
     */
    static startLogPageView(params) {
        if (Platform.OS == "android") {
            JAnalyticsModule.onPageStart(params);
        } else {
            JAnalyticsModule.startLogPageView(params);
        }
    }

    /**
     * 停止记录页面停留
     *
     * @param {object} params = {
     *  pageName: Stirng   // 页面名称，用于标识页面
     * }
     */
    static stopLogPageView(params) {
        if (Platform.OS == "android") {
            JAnalyticsModule.onPageEnd(params);
        } else {
            JAnalyticsModule.stopLogPageView(params);
        }
    }

    /**
     * 上报事件
     * 除了 extra 其他都是必填
     * @param {object} event 可以为如下 5 种事件
     *
     * loginEvent = {
     *  type: 'login',  // 必填
     *  extra: Object,  // 附加键值对，格式 {String: String}
     *  method: String，  // 填自己的登录方法
     *  success: Boolean
     * }
     *
     * registerEvent = {
     *  type: 'register',  // 必填
     *  extra: Object,  // 附加键值对，格式 {String: String}
     *  method: String，  // 填自己的登录方法
     *  success: Boolean
     * }
     *
     * purchaseEvent = {
     *  type: 'purchase', // 必填
     *  extra: Object,  // 附加键值对，格式 {String: String}
     *  goodsType: String,
     *  goodsId: String,
     *  goodsName: String,
     *  success: Boolen,
     *  price: float,
     *  currency: String, // CNY, USD
     *  count: int
     * }
     *
     * browseEvent = {
     *  type: 'browse',
     *  id: String,
     *  extra: Object,  // 附加键值对，格式 {String: String}
     *  name: String,
     *  contentType: String,
     *  duration: float
     * }
     *
     * countEvent = {
     *  type: 'count',
     *  extra: Object,  // 附加键值对，格式 {String: String}
     *  id: String
     * }
     *
     * calculateEvent = {
     *  type: 'calculate',
     *  extra: Object,  // 附加键值对，格式 {String: String}
     *  id: String,
     *  value: double
     * }
     */
    static postEvent(event) {
        if (Platform.OS == "android") {
            JAnalyticsModule.onEvent(event);
        } else {
            JAnalyticsModule.eventRecord(event);
        }
    }

    /**
     * 设置统计上报的自动周期，未调用前默认即时上报
     *
     * @param {object} params = {
     *  period: Number  //周期，单位秒，最小10秒，最大1天，超出范围会打印调用失败日志。传0表示统计数据即时上报
     * }
     */
    static setAnalyticsReportPeriod(params) {
        if (Platform.OS == "android") {
            JAnalyticsModule.setAnalyticsReportPeriod(params);
        }else {
            JAnalyticsModule.setFrequency(params);
        }
    }

    /**
     * 设置用户信息
     * @param {Object} params = {
     *  accountID: String,            // 账号ID
     *  name: String,                 // 姓名
     *  creationTime: Number,         // 账号创建时间
     *  sex: Number,                  // 性别
     *  paid: Number,                 // 是否付费
     *  birthdate: String,            // 出生年月
     *  phone: String,                // 手机号码
     *  email: String,                // 电子邮件
     *  weiboID: String,              // 新浪微博ID
     *  wechatID: String,             // 微信ID
     *  qqID: String,                 // QQ ID
     *  extras: object                // Optional. 扩展参数，附加键值对，格式 {String: String}
     * }
     * @param {Function} success = () => {}
     * @param {Function} fail = () => {}
     */
    static identifyAccount(params, success, fail) {
        JAnalyticsModule.identifyAccount(params, success, fail);
    }

    //解绑账户
    static detachAccount(success, fail) {
        JAnalyticsModule.detachAccount(success, fail);
    }

    //******************************************android Only******************************************

    static crashLogOFF() {
        if (Platform.OS == "android") {
            JAnalyticsModule.stopCrashHandler();
        }
    }

    /**
     * Android Only
     * 动态配置channel，优先级比AndroidManifest里配置的高,需要在初始化方法 setup 前调用
     *
     * @param {object} params = {
     *  channel: String  //希望配置的channel
     * }
     */
    static setChannel(params) {
        JAnalyticsModule.setChannel(params);
    }


    //******************************************iOS Only******************************************

    /**
     * 上报位置信息 iOS Only
     *
     * @param {object} params = {
     *  latitude: float   // 经度
     *  longitude: float  // 纬度
     * }
     */
    static uploadLocation(params) {
        if (Platform.OS == "ios") {
            JAnalyticsModule.setLatitude(params);
        }
    }

    /**
     * 手动将捕获到的错误日志交给原生层上报(仅ios)
     *
     * @param {object} params = {
     *  name: string       //error.name
     *  message: string    //error.message
     * }
     */
    static collectRNCrash(params) {
        if (Platform.OS === "ios") {
            JAnalyticsModule.collectCrash(params);
        }
    }

    /**
     * 开启js错误错误日志采集上报(仅ios)
     *
     * 如果开发者没有手动捕获错误日志，则使用此api即可
     *
     */
    static rnCrashLogON() {
        if (Platform.OS === "ios") {
            setJSExceptionHandler((e, isFatal) => {
                var param = {
                    name: e.name + "",
                    message: e.message + ""
                }
                JAnalyticsModule.collectCrash(param)
            }, true);
        }
    }

}
